#!/bin/bash


##### 描述 ########
# 1. 抓取 dmesg 带有关键字的日志，记录到指定 log file (用胡需要配置关键字和日志记录路径)
# 2. 使用 ./klog.sh


# 用户配置
LOG_FILE="./msg.log"
KEY="ctk"

# 获取系统启动时间 (以秒为单位)
BOOT_TIME=$(date -d "$(uptime -s)" +%s)

LOG_FILE_TS=".$LOG_FILE.ts"
echo "0" > "${LOG_FILE_TS}"

while true; do
    # 获取以 "ctk" 开头的 dmesg 日志
    dmesg | grep -E "^\[ *[0-9.]+\] $KEY" | while read -r line; do
        # 提取内核时间戳和日志内容
        KERNEL_TIMESTAMP=$(echo "$line" | grep -oE "^[\[ ]*([0-9.]+)" | tr -d '[] ')
        LAST_TIMESTAMP=$(cat $LOG_FILE_TS)

        if (( $(echo "$KERNEL_TIMESTAMP <= $LAST_TIMESTAMP" | bc -l) )); then
            continue
        fi

        echo "last_time=${LAST_TIMESTAMP}, cur_line=$KERNEL_TIMESTAMP"

        LOG_CONTENT=$(echo "$line" | sed -E "s/^\[ *[0-9.]+\] //")

        # 计算UTC时间戳
        LOG_TIME=$(date -u -d "@$((BOOT_TIME + ${KERNEL_TIMESTAMP%.*}))" "+%Y-%m-%d %H:%M:%S")

        # 写入日志文件
        echo "[$LOG_TIME] $LOG_CONTENT" >> "$LOG_FILE"

        LAST_TIMESTAMP=$KERNEL_TIMESTAMP
        echo "$LAST_TIMESTAMP" > "$LOG_FILE_TS"
    done

    sleep 3
done


rm -rf ${LOG_FILE_TS}